/*
 ============================================================================
 * Archivo:   VentanaSalidaPajaros.cpp
 * Autor:     Martin Lucero
 ============================================================================
 */

#include "VentanaSalidaPajaros.h"
#include "PropiedadesNivel.h"

VentanaSalidaPajaros::VentanaSalidaPajaros(PropiedadesNivel *propNivel) {
	set_title("GENERADOR");
	set_position(Gtk::WIN_POS_CENTER);
	set_border_width(10);
	set_keep_above(true);

	nivel = propNivel;
	sp_Grid = new Gtk::Grid;
	sp_Grid->set_row_spacing(10);
	sp_Grid->set_column_spacing(10);

	sp_ComboBox_bordeSalida.append("Cielo");
	sp_ComboBox_bordeSalida.append("Borde Izquierdo");
	sp_ComboBox_bordeSalida.append("Borde Derecho");
	sp_ComboBox_bordeSalida.set_active(2);
	sp_ComboBox_bordeSalida.signal_changed().connect(sigc::mem_fun(*this,
			&VentanaSalidaPajaros::on_combo_changed));

	sp_Button_agregar.set_label("Agregar");
	sp_Button_agregar.signal_clicked().connect(sigc::mem_fun(*this,
			&VentanaSalidaPajaros::on_button_agregar_clicked));

	sp_Button_salir.set_label("Salir");
	sp_Button_salir.signal_clicked().connect(sigc::mem_fun(*this,
			&VentanaSalidaPajaros::on_button_salir_clicked));

	ajuste_posInicio = Gtk::Adjustment::create(0, 0, nivel->getMaxAltura());
	sp_SpinButton_posInicio.set_adjustment(ajuste_posInicio);
	sp_SpinButton_posInicio.set_wrap();
	sp_SpinButton_posInicio.set_numeric();
	sp_SpinButton_posInicio.set_alignment(Gtk::ALIGN_CENTER);
	sp_SpinButton_posInicio.set_update_policy(Gtk::UPDATE_IF_VALID);

	ajuste_longitud = Gtk::Adjustment::create(1, 1, 1023);
	sp_SpinButton_longitud.set_adjustment(ajuste_longitud);
	sp_SpinButton_longitud.set_wrap();
	sp_SpinButton_longitud.set_numeric();
	sp_SpinButton_longitud.set_alignment(Gtk::ALIGN_CENTER);
	sp_SpinButton_longitud.set_update_policy(Gtk::UPDATE_IF_VALID);

	Gtk::Label *etiqueta;

	etiqueta = Gtk::manage(
			new Gtk::Label("GENERADOR DE PAJAROS", Gtk::ALIGN_CENTER));
	sp_Grid->attach(*etiqueta, 0, 0, 2, 1);

	etiqueta = Gtk::manage(
			new Gtk::Label("Borde de salida", Gtk::ALIGN_CENTER));
	sp_Grid->attach(*etiqueta, 0, 1, 1, 1);
	sp_Grid->attach_next_to(sp_ComboBox_bordeSalida, *etiqueta, Gtk::POS_RIGHT, 1, 1);

	etiqueta = Gtk::manage(
			new Gtk::Label("Posicion de inicio", Gtk::ALIGN_CENTER));
	sp_Grid->attach(*etiqueta, 0, 2, 1, 1);
	sp_Grid->attach_next_to(sp_SpinButton_posInicio, *etiqueta, Gtk::POS_RIGHT, 1, 1);

	etiqueta = Gtk::manage(
			new Gtk::Label("Longitud de linea", Gtk::ALIGN_CENTER));
	sp_Grid->attach(*etiqueta, 0, 3, 1, 1);
	sp_Grid->attach_next_to(sp_SpinButton_longitud, *etiqueta, Gtk::POS_RIGHT, 1, 1);

	sp_Grid->attach(sp_Button_agregar, 0, 4, 1, 1);
	sp_Grid->attach(sp_Button_salir, 1, 4, 1, 1);

	add(*sp_Grid);

	show_all_children();
}

void VentanaSalidaPajaros::resetear() {
	set_position(Gtk::WIN_POS_CENTER);
	sp_ComboBox_bordeSalida.set_active(2);
	ajuste_posInicio->set_value(0);
	ajuste_longitud->set_value(1);
}

void VentanaSalidaPajaros::on_combo_changed() {
	switch (sp_ComboBox_bordeSalida.get_active_row_number()) {
		case 0:
		{
			ajuste_posInicio->set_upper(nivel->getMaxAnchura());
			break;
		}
		default:
		{
			ajuste_posInicio->set_upper(nivel->getMaxAltura());
		}
	}
}

void VentanaSalidaPajaros::on_button_agregar_clicked() {
	unsigned posXinicial, posYinicial, posXfinal, posYfinal;
	unsigned longitud = (unsigned)sp_SpinButton_longitud.get_value_as_int();

	switch (sp_ComboBox_bordeSalida.get_active_row_number()) {
			/* Caso salen del cielo */
		case 0:
		{
			posXinicial = (unsigned)sp_SpinButton_posInicio.get_value_as_int();
			posYinicial = 0;
			posXfinal = posXinicial + longitud;
			if (posXfinal > nivel->getMaxAnchura()) {
				posXfinal = nivel->getMaxAnchura();
			}
			posYfinal = 0;
			break;
		}
			/* Caso salen del borde izquierdo */
		case 1:
		{
			posXinicial = 0;
			posYinicial = (unsigned)sp_SpinButton_posInicio.get_value_as_int();
			posXfinal = 0;
			posYfinal = posYinicial + longitud;
			if (posYfinal > nivel->getMaxAltura()) {
				posYfinal = nivel->getMaxAltura();
			}
			break;
		}
			/* Caso salen del borde derecho */
		case 2:
		{
			posXinicial = nivel->getMaxAnchura();
			posYinicial = (unsigned)sp_SpinButton_posInicio.get_value_as_int();
			posXfinal = nivel->getMaxAnchura();
			posYfinal = posYinicial + longitud;
			if (posYfinal > nivel->getMaxAltura()) {
				posYfinal = nivel->getMaxAltura();
			}
			break;
		}
	}
	nivel->agregarLineaSalidaPajaros(posXinicial, posYinicial, posXfinal,
			posYfinal);
}

void VentanaSalidaPajaros::on_button_salir_clicked() {
	hide();
}

VentanaSalidaPajaros::~VentanaSalidaPajaros() {
	delete sp_Grid;
}